package com.yunxi.module.system.service.permission;

import com.yunxi.module.system.dto.permission.DeptDataPermissionRespDTO;

import java.util.Collection;
import java.util.Set;

/**
 * <p>
 * 权限 Service 接口
 * </p>
 * 提供用户-角色、角色-菜单、角色-部门的关联权限处理
 *
 * @author lidy
 * @since 2024-05-07
 */
public interface PermissionService {

    /**
     * 判断是否有权限，任一一个即可
     *
     * @param userId      用户编号
     * @param permissions 权限
     * @return 判断结果
     */
    boolean hasAnyPermissions(Long userId, String... permissions);

    /**
     * 判断用户是否有角色：具有其中一个即可
     *
     * @param userId 用户编号
     * @param roles  角色集合
     * @return 判断结果
     */
    boolean hasAnyRoles(Long userId, String... roles);

    // ============== 角色-菜单 相关方法 ========================

    /**
     * 为角色分配菜单
     *
     * @param roleId  角色编号
     * @param menuIds 菜单编号集合
     */
    void assignRoleMenu(Long roleId, Set<Long> menuIds);

    /**
     * 获得拥有指定菜单的角色编号数组，从缓存中获取
     *
     * @param menuId 菜单编号
     * @return 角色编号数组
     */
    Set<Long> getMenuRoleIdListByMenuIdFromCache(Long menuId);

    /**
     * 处理删除菜单时，删除相关授权数据
     *
     * @param menuId 菜单编号
     */
    void processMenuDeleted(Long menuId);

    /**
     * 获得角色集合拥有的菜单编号集合
     *
     * @param roleIds 角色编号集合
     * @return 菜单编号集合
     */
    Set<Long> getRoleMenuListByRoleId(Collection<Long> roleIds);

    /**
     * 处理角色删除时，删除相关授权数据
     *
     * @param roleId 角色编号
     */
    void processRoleDeleted(Long roleId);

    /**
     * 获得角色拥有的菜单编号集合
     *
     * @param roleId 角色编号
     * @return 菜单编号集合
     */
    Set<Long> getRoleMenuListByRoleId(Long roleId);

    // ================= 用户-角色 相关方法 ======================

    /**
     * 为用户分配角色
     *
     * @param userId  用户编号
     * @param roleIds 角色编号集合
     */
    void assignUserRole(Long userId, Set<Long> roleIds);

    /**
     * 删除用户时，删除关联的授权数据
     *
     * @param userId 用户编号
     */
    void processUserDeleted(Long userId);

    /***
     * 获得拥有多个角色的用户编号集合
     * @param roleIds 角色编号集合
     * @return 用户编号集合
     */
    Set<Long> getUserRoleIdListByRoleId(Collection<Long> roleIds);

    /**
     * 获得用户拥有的角色编号集合，从缓存中获取
     *
     * @param userId 用户编号
     * @return 角色编号集合
     */
    Set<Long> getUserRoleIdListByUserIdFromCache(Long userId);

    /**
     * 获得用户拥有的角色编号集合
     *
     * @param userId 用户编号
     * @return 角色编号集合
     */
    Set<Long> getUserRoleIdListByUserId(Long userId);


    // =================== 用户-部门 相关方法 =================

    /**
     * 获得登陆用户的部门数据权限
     *
     * @param userId 用户编号
     * @return 部门数据权限
     */
    DeptDataPermissionRespDTO getDeptDataPermission(Long userId);

    /**
     * 为角色分配数据权限
     *
     * @param roleId           角色编号
     * @param dataScope        数据权限
     * @param dataScopeDeptIds 数据权限部门编号
     */
    void assignRoleDataScope(Long roleId, Integer dataScope, Set<Long> dataScopeDeptIds);
}
